19 Dec 2025
Django community aggregator: Community blog posts
Django News - New Django Software Foundation Board and Year-End Fundraiser - Dec 19th 2025
News
Hitting the Home Stretch: Help Us Reach the Django Software Foundation's Year-End Goal!
Django Software Foundation requests year-end donations to close a $300,000 fundraising goal, supporting an expanded Fellows program, security work, releases, and community events.
Introducing the 2026 DSF Board
Django Software Foundation announced the 2026 board and officers, welcomed the newly elected directors, thanked the outgoing members, and linked the board minutes and contact information.
DjangoCon US 2026 CFP is open!
DjangoCon US 2026 will take place September 14-18 in Chicago (talks September 14-16, sprints September 17-18), and the Call for Proposals is open now with a submission deadline of March 16, 2026 at 11:00 AM CDT.
PEP 8107 - 2026 Term Steering Council election
The results of the 2026 Python Steering Council election were published in PEP 8107, and the five winners are Pablo Galindo Salgado, Savannah Ostrowski, Barry Warsaw, Donghee Na, and Thomas Wouters. Congratulations to all of them on being elected to guide Python's development for the coming term.
Releases
Python 3.15.0 alpha 3
Python 3.15.0 alpha 3 is now available as an early developer preview, highlighting features like a new statistical sampling profiler, UTF-8 as the default encoding, a new PyBytesWriter C API, and improved error messages, with more changes planned before beta in May 2026.
Djangonaut Space News
Finding opportunities to contribute to Django
Djangonaut Space proposes creating a clear, welcoming "map" of the Django ecosystem to help newcomers discover meaningful ways to contribute, while encouraging projects to improve onboarding and contributor pathways.
Updates to Django
Today, "Updates to Django" is presented by Raffaella from Djangonaut Space! 🚀
Last week we had 15 pull requests merged into Django by 11 different contributors.
News in Django 6.1:
- The new
UUID4andUUID7database functions were added. GeneratedFieldnow supports stored columns (db_persistset toTrue) on Oracle 23ai/26ai (23.7+).
A special mention goes to the new contributors from last weeks: congratulations to Dmitry Chestnykh, Rida Zouga, Krishna Chaitanya, Hwayoung Cha 🚀, Νικόλαος-Διγενής Καραγιάννης, and Rim Choi 🚀 for having their first commits merged into Django - welcome on board!
Django Newsletter
Articles
ty: An extremely fast Python type checker and language server
ty is an extremely fast Python type checker and language server, written in Rust, and designed as an alternative to mypy, Pyright, and Pylance.
Dependency groups and uv run
Simon Willison explains a clean uv-based workflow using PEP 735 dependency groups, especially a dev group, to make Python projects instantly runnable and testable with uv run without manual virtual environment setup.
Rich text editors: How restrictive can we be?
django-prose-editor evolved from strict schemas to TextClass, NodeClass, and ClassLoom extensions to provide controlled, combinable CSS class styling while preserving safety.
My first win building with agents
Facundo Olano shares how he successfully shipped a minimal Django web app almost entirely with agentic coding, outlining a pragmatic, test-driven workflow that treats AI as a junior collaborator rather than a replacement for experienced Django judgment.
Your job is to deliver code you have proven to work
Simon Willison argues that in an era of AI-assisted development, a developer's real responsibility is not producing large amounts of code but delivering changes that are demonstrably proven to work through clear manual testing and solid automated tests.
Will Vincent's Year in Review (2025)
Will Vincent (Django News co-founder) reflects on 2025, covering his move to JetBrains as a Python Developer Advocate, conference talks and travel, major book and LearnDjango updates, a prolific year of blogging, podcasting, and newsletters, and his plans to focus more on video and Django 6.0 updates in 2026.
Kevin Renskers's 2025 in review
A reflective and productive year marked by personal upheaval, record-setting writing output, meaningful open source work, cautious AI adoption, and a growing emphasis on sustainability, focus, and choosing where limited time and energy truly matter.
Tutorials
🚀 How To Deploy Django 6 On Ubuntu VPS
Step-by-step production-ready guide showing how to deploy Django 6 on Ubuntu VPS using Gunicorn, Nginx, optional PostgreSQL, systemd, Certbot, and security hardening.
Sponsored Link 2
AI-Powered Django Development & Consulting
REVSYS specializes in integrating powerful AI technologies, including GPT-5, directly into your Django applications. We help bring modern, intelligent features to your project that boost user engagement and streamline content workflows.
Django Job Board
Here are this week's Django job highlights, spanning fully remote UK roles, US based security and platform work, and senior engineering positions, plus a quick reminder that Django News Jobs has rebranded as the Django Job Board at https://djangojobboard.com.
Founding Full-Stack Senior Engineer (UK ONLY) - Fully Remote at MyDataValue 🆕
Python/Django Senior Application Security Engineer at Energy Solutions
Python / Django Developer at Client of Foxley Talent
Staff Software Engineer at Bluebird Kids Health
Django Newsletter
Django Codebase
[Proposal] Scheduled daily GitHub workflow to run tests using Django's main branch #2391
Discussion and proposal to have djangoproject.com website run tests against Django main everyday.
Added "raw" argument to m2m_changed signals
Mariusz Felisiak fixed a 9-year old ticket allowing signals to skip receivers when loading fixtures (especially for m2m relations).
Projects
Django MailAuth just got a documentation refresh!
Django Mail Auth is a lightweight authentication backend for Django, that does not require users to remember passwords.
adamghill/django-new
Create new Django applications with pizazz. 🚀.
kennethlove/django-admin-action-hero
Easy admin action creation for Django.
This RSS feed is published on https://django-news.com/. You can also subscribe via email.
19 Dec 2025 5:00pm GMT
More adventures in building template components in Django
I discovered a new pattern in using one of the latest features from Django 6.0, template-partials. I probably need to give Claude some credit along with Tailwind Plus for the initial HTML. Earlier this week I was building out a modal pattern for the latest project I am building. You click a button, a modal pops up and loads a form via HTMX. Then submit the form and modal closes with the response triggering other HTMX updates on the page. I was building this out in tandem with Claude Code, with the starting point being a modal from Tailwind Plus which I thought only included the modal, but they also included the button to trigger the modal as well. Well the AI took this and ran with and essentially ended up with a Django template that looks like this:
{% partialdef trigger %}
<button hx-get...>...</button>
{% endpartialdef trigger %}
{% partialdef modal %}
<dialog>
<form>
...
</form>
</dialog>
{% endpartialdef modal %}
I don't think I would have ever thought to have included the button section as a partial in this context, but I like the results since both can be used with the include tag at different points and you have locality of behaviour if you want to update some aspect that affects both. I'm less likely to need to jump around to every button to add an attribute for example.
This got me thinking though, where else can partials fit in? Part of the magic with partials is the hash reference in the string reference to a template file. This means partials can be used in templatetags, earlier this year I wrote about using simple_block_tag in combination with get_template to produce a component like interface to build about a navigation. With partials I can merge the 3 small template files into a single template file with 3 partial templates. I think this is just the start for partials and template tags and I'm keen to explore their intersection even more in the coming weeks and months.
Finally the other area which Carlton recently hinted at on Mastodon is in the area of Form rendering. Django 4.X saw the refactoring of Form rendering into the FormRenderer class. This class allows the specification of snippet template files to customise how various form and form elements are rendered at a variety of levels from global down to individual forms. Again we can specify partials here instead of individual templates. I need to work on this a bit more, but the hope is a single file of partials that is something of a spritesheet of form components instead of jumping around multiple files. We can then use partials to deduplicate these templates.
Here is a quick example of my PartialsFormRenderer:
from django.forms.renderers import TemplatesSetting
class PartialsFormRenderer(TemplatesSetting):
form_template_name = "forms/form_snippet.html#form"
field_template_name = "forms/form_snippet.html#field"
```
I am excited for what comes next and how much we could achieve with Django features alone!
19 Dec 2025 6:00am GMT
17 Dec 2025
Django community aggregator: Community blog posts
Rich text editors: How restrictive can we be?
Rich text editors: How restrictive can we be?
How restrictive should a rich text editor be? It's a question I keep coming back to as I work on FeinCMS and Django-based content management systems.
I published the last blog post on django-prose-editor specifically in August 2025, Menu improvements in django-prose-editor. The most interesting part of the blog post was the short mention of the TextClass extension at the bottom which allows adding a predefined list of CSS classes to arbitrary spans of text.
In the meantime, I have spent a lot of time working on extensions that try to answer this question: the TextClass extension for adding CSS classes to inline text, and more recently the NodeClass extension for adding classes to nodes and marks. It's high time to write a post about it.
Rich Text editing philosophy
All of this convinced me that offering the user a rich text editor with too much capabilities is a really bad idea. The rich text editor in FeinCMS only has bold, italic, bullets, link and headlines activated (and the HTML code button, because that's sort of inevitable - sometimes the rich text editor messes up and you cannot fix it other than going directly into the HTML code. Plus, if someone really knows what they are doing, I'd still like to give them the power to shoot their own foot).
- Commit in the FeinCMS repository, August 2009, current version from django-content-editor design decisions
Should we let users shoot themselves in the foot?
Giving power users an HTML code button would have been somewhat fine if only the editors themselves were affected. Unfortunately, that was not the case.
As a team we have spent more time than we ever wanted debugging strange problems only to find out that the culprit was a blob of CSS or JavaScript inserted directly into an unsanitized rich text editor field. We saw everything from a few reasonable and well scoped lines of CSS to hundreds of KiBs of hotlinked JavaScript code that broke layouts, caused performance issues, and possibly even created security vulnerabilities.
We have one more case of Betteridge's law of headlines here.
The pendulum swings
The first version of django-prose-editor which replaced the venerable CKEditor 4 in our project was much more strict and reduced - no attributes, no classes, just a very short list of allowlisted HTML tags in the schema.
We quickly hit some snags. When users needed similar headings with different styles, we worked around it by using H2 and H3 - not semantic at all. I wasn't exactly involved in this decision; I just didn't want to rock the boat too much, since I was so happy that we were even able to use the more restricted editor at all in this project.
Everything was good for a while, but more and more use cases crept up until it was clear that something had to be done about it. First, the TextClass extension was introduced to allow adding classes to inline text, and later also the NodeClass extension mentioned above. This was a compromise: The customer wanted inline styles, we wanted as little customizability as possible without getting in the way.
That said, we obviously had to move a bit. After all, going back to a less strict editor or even offering a HTML blob injection would be worse. If we try to be too restrictive we will probably have to go back to allowing everything some way or the other, after all:
The more you tighten your grip, Tarkin, the more star systems will slip through your fingers.
- Princess Leia
Combining CSS classes
The last words are definitely not spoken just yet. As teased on Mastodon at the beginning of this month I am working on an even more flexible extension which unifies the NodeClass and TextClass extensions into a single ClassLoom extension.
The code is getting real world use now, but I'm not ready to integrate it yet into the official repository. However, you can use it if you want, it's 1:1 the version from a project repository. Get the ClassLoom extension here.
This extension also allows combining classes on a single element. If you have 5 colors and 3 text styles, you'd have to add 15 combinations if you were only able to apply a single class. Allowing combinations brings the number of classes down to manageable levels.
Conclusion
So, back to the original question: How restrictive can we be?
The journey from CKEditor 4's permissiveness through django-prose-editor's initial strictness to today's ClassLoom extension has been one of finding that balance. Each extension - TextClass, NodeClass, and now ClassLoom - represents a step toward controlled flexibility: giving content editors the styling options they need while keeping the content structured, maintainable, and safe.
17 Dec 2025 6:00pm GMT
